package org.funtester.performance.books.chapter03.section8;

import java.util.concurrent.atomic.AtomicBoolean;

/**
 * TPS模型多线程任务类
 */
public abstract class TpsThreadTask implements Runnable {

    /**
     * 全局是否终止测试任务开关
     */
    public static AtomicBoolean ABORT = new AtomicBoolean(false);

    /**
     * 用于标识是否统计响应时间
     */
    public static boolean countState = false;

    /**
     * 多线程任务执行方法
     */
    @Override
    public void run() {
        before();// 前置处理
        if (ABORT.get()) {// 判断是否终止测试任务
            return;
        }
        try {
            long start = System.currentTimeMillis();// 记录开始时间
            test();// 测试方法
            long end = System.currentTimeMillis();// 记录结束时间
            int delay = (int) (end - start);
            TpsTaskExecutor.realTimeCostTime.add(delay);// 记录实时执行时间
            TpsTaskExecutor.realTimeCostTimes.add(1);// 记录实时执行次数
            if (countState) {
                TpsTaskExecutor.executeNumStatistic.getAndIncrement();// 记录执行次数
                TpsTaskExecutor.costTimeStatistic.add(delay);// 记录响应时间
            }
        } catch (Exception e) {
            if (countState) TpsTaskExecutor.errorNumStatistic.getAndIncrement();// 记录错误次数
            e.printStackTrace();
        }
        after();// 后置处理
    }

    /**
     * 前置处理方法
     */
    public void before() {
    }

    /**
     * 测试方法
     */
    public abstract void test();

    /**
     * 后置处理方法
     */
    public void after() {
    }


}
